/**
 * 登录注册功能的数据类型定义
 */

// 用户基本信息接口
export interface UserInfo {
  id: string;
  username: string;
  email?: string;
  phone?: string;
  avatar?: string;
  nickname?: string;
  createTime: string;
  updateTime: string;
  points?: number; // 用户积分
}

// 密码登录请求数据
export interface PasswordLoginRequest {
  account: string; // 手机号或邮箱
  password: string;
}

// 验证码登录请求数据
export interface CodeLoginRequest {
  phone: string;
  code: string;
}

// 注册请求数据
export interface RegisterRequest {
  username: string;
  password: string;
  confirmPassword: string;
  phone: string;
  email?: string;
  nickname?: string;
  verifyCode: string; // 手机验证码
}

// 发送验证码请求数据
export interface SendCodeRequest {
  phone: string;
  type: 'login' | 'register' | 'reset'; // 验证码类型
}

// 找回密码请求数据
export interface ResetPasswordRequest {
  phone: string;
  verifyCode: string;
  newPassword: string;
  confirmPassword: string;
}

// API响应基础结构
export interface ApiResponse<T = any> {
  success: boolean;
  code: number;
  message: string;
  data: T;
}

// 登录响应数据
export interface LoginResponse {
  token: string;
  userInfo: UserInfo;
  expiresIn: number; // token过期时间(秒)
}

// 验证码响应数据
export interface SendCodeResponse {
  success: boolean;
  message: string;
  expireTime: number; // 验证码过期时间(秒)
}

// 页面状态类型
export interface LoginPageData {
  // 基础状态
  isPasswordLogin: boolean; // 是否密码登录模式
  isRegisterMode: boolean; // 是否注册模式
  isSubmit: boolean; // 是否可提交
  isCheck: boolean; // 是否同意协议
  radioValue: string; // 协议复选框值
  
  // 密码登录数据
  passwordInfo: PasswordLoginRequest;
  
  // 验证码登录数据
  phoneNumber: string;
  isPhoneNumber: boolean;
  
  // 注册数据
  registerInfo: RegisterRequest;
  
  // 验证码相关
  verifyCode: string;
  sendCodeCount: number;
  
  // 找回密码数据
  resetPasswordInfo: ResetPasswordRequest;
}

// 表单验证规则
export interface ValidationRule {
  required?: boolean;
  minLength?: number;
  maxLength?: number;
  pattern?: RegExp;
  message: string;
}

// 表单验证结果
export interface ValidationResult {
  isValid: boolean;
  errors: string[];
}

// 常用正则表达式
export const Patterns = {
  phone: /^[1][3,4,5,7,8,9][0-9]{9}$/, // 手机号
  email: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, // 邮箱
  password: /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{6,20}$/, // 密码(6-20位，包含字母和数字)
  username: /^[a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/, // 用户名(2-20位，字母数字下划线中文)
  verifyCode: /^\d{6}$/, // 6位数字验证码
};

// 表单验证规则配置
export const ValidationRules = {
  username: {
    required: true,
    minLength: 2,
    maxLength: 20,
    pattern: Patterns.username,
    message: '用户名2-20位，支持字母数字下划线中文'
  },
  password: {
    required: true,
    minLength: 6,
    maxLength: 20,
    pattern: Patterns.password,
    message: '密码6-20位，必须包含字母和数字'
  },
  phone: {
    required: true,
    pattern: Patterns.phone,
    message: '请输入正确的手机号'
  },
  email: {
    required: false,
    pattern: Patterns.email,
    message: '请输入正确的邮箱格式'
  },
  verifyCode: {
    required: true,
    pattern: Patterns.verifyCode,
    message: '请输入6位数字验证码'
  }
};

// API接口路径常量
export const ApiPaths = {
  // 登录相关
  passwordLogin: '/auth/login/password', // 密码登录
  codeLogin: '/auth/login/code', // 验证码登录
  logout: '/auth/logout', // 退出登录
  
  // 注册相关
  register: '/auth/register', // 用户注册
  checkUsername: '/auth/check/username', // 检查用户名是否可用
  checkPhone: '/auth/check/phone', // 检查手机号是否已注册
  
  // 验证码相关
  sendCode: '/auth/code/send', // 发送验证码
  verifyCode: '/auth/code/verify', // 验证验证码
  
  // 密码相关
  resetPassword: '/auth/password/reset', // 重置密码
  changePassword: '/auth/password/change', // 修改密码
  
  // 用户信息
  getUserInfo: '/user/info', // 获取用户信息
  updateUserInfo: '/user/update', // 更新用户信息
};

// 错误码常量
export const ErrorCodes = {
  // 通用错误
  SUCCESS: 200,
  BAD_REQUEST: 400,
  UNAUTHORIZED: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  INTERNAL_ERROR: 500,
  
  // 业务错误码
  USER_NOT_EXISTS: 1001, // 用户不存在
  PASSWORD_ERROR: 1002, // 密码错误
  USER_EXISTS: 1003, // 用户已存在
  PHONE_EXISTS: 1004, // 手机号已注册
  CODE_ERROR: 1005, // 验证码错误
  CODE_EXPIRED: 1006, // 验证码过期
  TOKEN_EXPIRED: 1007, // token过期
  PARAMS_ERROR: 1008, // 参数错误
};

// 存储键名常量
export const StorageKeys = {
  ACCESS_TOKEN: 'access_token',
  USER_INFO: 'user_info',
  LOGIN_TYPE: 'login_type', // 登录方式
  REMEMBER_ACCOUNT: 'remember_account', // 记住账号
}; 